package main

import (
	"encoding/json"
	"fmt"
)

// 只要是自定义类型，就可以有方法
// 重写了String()方法，调用Println()会调用重写的String()方法
func main() {
	testTypeMethod()
	testString()
}

// 自定义类型~
type integer int

// 自定义类型-方法
func (num integer) print() {
	fmt.Println("num=", num)
}

// 自定义类型-方法
func (num *integer) changeAndPrint() {
	*num = *num * 2
	fmt.Println("num=", *num)
}

func testTypeMethod() {
	var num integer = 10
	num.print()             //10
	fmt.Println(num)        //10
	(&num).changeAndPrint() //20
	fmt.Println(num)        //20
}

func testString() {
	var p Person = Person{"zhangsan", 1}
	//重写了String()方法，调用Println()会调用重写的String()方法
	fmt.Println(&p) //{"name":"zhangsan","age":1}
}

type Person struct {
	Name string `json:"name"` //使用tag可以反射，例如可以序列化和反序列化
	Age  int    `json:"age"`
}

func (p *Person) String() string {
	var str string
	marshal, err := json.Marshal(*p) //序列化
	if err != nil {
		fmt.Println("json-error", err)
	} else {
		str = string(marshal)
	}
	return str
}
